home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / lib / yotpin / src / consline.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-01  |  2.9 KB  |  128 lines

  1. /*
  2. *    Yamana's Otomeza Plug-in Tool
  3. *        集中線
  4. *    
  5. *    1995.08.20    
  6. *    1995.08.27    高速化
  7. *    
  8. */
  9. #include    "otome_pi.h"
  10. #include    "costbl.h"
  11. #include    "my_hatch.h"
  12.  
  13. const char longname[]  = "DRAW  : 集中線";
  14. int            cnfg_max = 4;
  15. PI_CNFG        cnfg[] =
  16.             {    /* 1234567890123456 ,min,max,def,set */
  17.                 { "線の間隔"        , 0,  21,  4,  4 },
  18.                 { "線の太さ"        , 0,  21,  4,  4 },
  19.                 { "集中の方向"        , 0,   2,  0,  0 },
  20.                 { "濃度"            , 0,  11,  0,  0 }
  21.             };
  22.  
  23. #define    USE_ENV        PI_SET_ENV
  24. #define    USE_TYPE    PI_DRAW_ELLF
  25.  
  26. #include    "otome_pi.c"
  27.  
  28. /********************************/
  29.  
  30. #define    set_hatch()    \
  31.         if( pat-pstep>= minpat )    pat -= pstep ;\
  32.                             else    pat =  minpat;\
  33.         EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
  34.                         HATCH_X, HATCH_Y, hatchData[pat] );
  35.  
  36. /* 外周円弧と内周円弧を計算し描画する */
  37. /* 扇形を描くより、計算量は増えるが断然速い。*/
  38. /* 同じ円弧を再計算している点に高速化の余地あり。*/
  39. #define    draw_line()    \
  40.         for( j=0; j<256; j+=(size+m) )\
  41.         {    p = para+2;\
  42.             for( i=size; i>=0 ; i--,p+=4 )\
  43.             {    WORD( p   ) = daen->x + (l * cos256( i+j )    >>8 );\
  44.                 WORD( p+2 ) = daen->y + (l * sin256( i+j )*rry>>16);\
  45.             }\
  46.             for( i=0; i<=size ; i++,p+=4 )\
  47.             {    WORD( p   ) = daen->x + ((l-lstep)*cos256( i+j )    >>8 );\
  48.                 WORD( p+2 ) = daen->y + ((l-lstep)*sin256( i+j )*rry>>16);\
  49.             }\
  50.             EGB_polygon( EgbPtr, para );\
  51.         }
  52.  
  53. int consentrate( daen, m, size,mode,pat )
  54. ELLIPSE    *daen;
  55. int     m,size,mode,pat ;
  56. {
  57.     int     r,rry;
  58.     int     i,j;
  59.     int     l, lstep, pstep;
  60.     int     hpat,minpat;
  61.     
  62.     char    *para,*p;
  63.     
  64.     if( daen->ry==0 || daen->rx==0 )    return ERROR;
  65.     
  66.     if( (para = (char*)PI_MALLOC( 2+(size+1)*4*2 ))==NULL )
  67.         return PI_ERROR_NO_MEMORY;
  68.     
  69.     hpat = HATCH_MAX - pat ;
  70.     if( !hpat )    return PI_ERROR_ETC;
  71.     
  72.     r   = daen->rx;
  73.     rry = daen->ry*256 / daen->rx;
  74.     
  75.     if( r > hpat )
  76.     {    lstep = r/hpat;
  77.         pstep = 1;
  78.     }else
  79.     {    lstep = 2;                /* 濃い色に偏りがちなので */
  80.         pstep = hpat / r * 2 ;    /* なるべく小さくなるよう精度を落とす */
  81.     }
  82.     minpat    = pat;
  83.     pat     = HATCH_MAX + pstep;
  84.     WORD( para ) = (size+1)*2;
  85.     if( size==0 )    m=256;
  86.     
  87.     if( mode==0 )    /* ↓中心部分が描画されないのを防ぐため */
  88.     {    for( l=(r/lstep*lstep); l>=lstep; l-=lstep )
  89.         {    set_hatch();
  90.             draw_line();
  91.         }
  92.     }else if( mode==1 )    /* ↓外周部分が描画されないのを防ぐ */
  93.     {    for( l=lstep; l<=(r+lstep); l+=lstep )
  94.         {    set_hatch();
  95.             draw_line();
  96.         }
  97.     }else
  98.     {    EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
  99.                         HATCH_X, HATCH_Y, hatchData[minpat] );
  100.         l = lstep = r+lstep;    /* 外周部対策 */
  101.         draw_line();
  102.     }
  103.     
  104.     PI_FREE( para );
  105.     return NOERR;
  106. }
  107.  
  108.  
  109. /********************************/
  110.  
  111. int APL_exec()
  112. {
  113.     int     line,size,mode,pat;
  114.     
  115.     line = cnfg[0].val * 2;
  116.     size = cnfg[1].val * 2+1;
  117.     mode = cnfg[2].val;
  118.     pat  = cnfg[3].val*4;
  119.     
  120.     EGB_writePage    ( EgbPtr, PI_PAGE );
  121.     EGB_paintMode    ( EgbPtr, EGB_PAINT_HATCHFF );
  122.     EGB_color        ( EgbPtr, EGB_PAINTCOL, PI_FORECOL );
  123.     
  124.     return consentrate( (ELLIPSE *)g_para, line, size, mode, pat );
  125.     
  126. }
  127.  
  128.